package com.nineclock.system.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nineclock.common.constant.NcConstant;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.threadlocal.CurrentUserHolder;
import com.nineclock.common.utils.BeanHelper;
import com.nineclock.system.dto.SysCompanyContactConfigDTO;
import com.nineclock.system.mapper.SysCompanyContactConfigMapper;
import com.nineclock.system.pojo.SysCompanyContactConfig;
import com.nineclock.system.service.SysCompanyContactConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
@Slf4j
public class SysCompanyContactConfigServiceImpl implements SysCompanyContactConfigService {

    @Autowired
    SysCompanyContactConfigMapper companyContactConfigMapper;

    @Override
    public void addCompanyContactConfig(SysCompanyContactConfigDTO companyContactConfigDTO) {

        // 健壮性的判断
        if(companyContactConfigDTO == null || companyContactConfigDTO.getName() == null){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }
        //从当前线程中获取 企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //把dto对象 中的属性值 赋值到 pojo中
        SysCompanyContactConfig companyContactConfig = BeanHelper.copyProperties(companyContactConfigDTO, SysCompanyContactConfig.class);

        //给其他的属性赋值
        companyContactConfig.setStatus((short)1);
        companyContactConfig.setFieldType("string");

        //假设一个企业 的id ， 后续再调整
        companyContactConfig.setCompanyId(companyId);
        //保存到数据库中
        companyContactConfigMapper.insert(companyContactConfig);
    }

    /**
     * 查询并初始化
     * 1. 查询该企业下的企业通讯录字段
     * 2. 如果没有，初始化的默认字段
     * 3. 如果有，直接查询并返回
     * @return
     */
    @Override
    public List<SysCompanyContactConfigDTO> queryCompanyContactConfig() {
        //从当前线程中获取 企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //查询该企业下的企业通讯录字段
        LambdaQueryWrapper<SysCompanyContactConfig> wrapper = new LambdaQueryWrapper<>();
        //配置条件
        wrapper.eq(SysCompanyContactConfig::getCompanyId, companyId);
        //获取 通讯录列表
        List<SysCompanyContactConfig> companyContactConfigList = companyContactConfigMapper.selectList(wrapper);
        //如果是null， 初始化 通讯录字段
        if(CollectionUtil.isEmpty(companyContactConfigList)){
            //创建null 的集合对象
            companyContactConfigList = new ArrayList<>();
            // 初始化 通讯录字段
            for (String name : NcConstant.COMPANY_CONFIG_CONTACT_LIST) {
                //创建pojo
                SysCompanyContactConfig companyContactConfig = new SysCompanyContactConfig();
                companyContactConfig.setName(name);
                companyContactConfig.setCompanyId(companyId);
                companyContactConfig.setFieldType("string");
                companyContactConfig.setType("fixed");
                companyContactConfig.setStatus((short)1);

                //保存数据
                companyContactConfigMapper.insert(companyContactConfig);

                //添加到集合中
                companyContactConfigList.add(companyContactConfig);
            }


        }

        //把pojo转换为dto
        List<SysCompanyContactConfigDTO> companyContactConfigDTOList = BeanHelper.copyWithCollection(companyContactConfigList, SysCompanyContactConfigDTO.class);

        return companyContactConfigDTOList;
    }

    @Override
    public void updateCompanyContactConfig(Long id, Short status) {
        //从当前线程中获取 企业id
        Long companyId = CurrentUserHolder.get().getCompanyId();

        //健壮性判断
        if(id == null  || status == null){
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }

        //根据id查询企业通讯录字段
        SysCompanyContactConfig companyContactConfig = companyContactConfigMapper.selectById(id);
        if(companyContactConfig != null){
            companyContactConfig.setStatus(status);
            companyContactConfig.setCompanyId(companyId);

            companyContactConfigMapper.updateById(companyContactConfig);
        }
    }
}
